// uses Arcfour as a PRNG

// tslint:disable-next-line:max-classes-per-file
export default class Arcfour {
	protected i = 0;
	protected j = 0;
	protected S = new Array();

	// Initialize arcfour context from key, an array of ints, each from [0..255]
	public init(key: number[]) {
		let i;
		let j;
		let t;
		for (i = 0; i < 256; ++i) {
			this.S[i] = i;
		}
		j = 0;
		for (i = 0; i < 256; ++i) {
			j = (j + this.S[i] + key[i % key.length]) & 255;
			t = this.S[i];
			this.S[i] = this.S[j];
			this.S[j] = t;
		}
		this.i = 0;
		this.j = 0;
	}
	public next() {
		this.i = (this.i + 1) & 255;
		this.j = (this.j + this.S[this.i]) & 255;
		const t = this.S[this.i];
		this.S[this.i] = this.S[this.j];
		this.S[this.j] = t;
		return this.S[(t + this.S[this.i]) & 255] as number;
	}
}
